//
//  UserAccountViewModel.swift
//  weibo 666
//
//  Created by mac on 15/11/8.
//  Copyright © 2015年 mac. All rights reserved.
//

import Foundation


/**
模型通常继承自 NSObject -> 可以使用 KVC 设置属性，简化对象构造
如果没有父类，所有的内容，都需要从头创建，量级更轻

视图模型的作用：封装`业务逻辑`，通常没有复杂的属性
*/
class UserAccountViewModel {
    
    
    ///单例-解决重复加载
    static let sharedUserAccount = UserAccountViewModel()
    
    //用户模型
    var account : UserAccount?
    
    ///返回有效的他token
    var accessToken: String? {
        // 如果 token 没有过期，返回 account.中的 token 属性
        if !isPass{
            return account?.access_token
        }
        return nil
    }
    //用户登录标记
    var userLogin: Bool {
        // 1. 如果 token 有值，说明登录成功
        // 2. 如果没有过期，说明登录有效
        return account?.access_token != nil && !isPass
        
    }
    ///用户头像
    var avatarUrl:NSURL{
        return NSURL(string: account?.avatar_large ?? "")!
    }
    
    /// 归档保存的路径 - 计算型属性(类似于有返回值的函数，可以让调用的时候，语义会更清晰)
    /// 如果在 OC 中，可以通过只读属性／函数的方式实现
    private var accountPath:String {
        
        //数组.last
        let path = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).last!
        
        return (path as NSString).stringByAppendingPathComponent("account.plist")
        
        
        
    }
    
    private var isPass:Bool {
        if account?.expriesDate?.compare(NSDate()) == NSComparisonResult.OrderedDescending{
            return false
        }
        
        //如果过期，返回true
        return true
        
    }
    init(){
        // 从沙盒解档数据，恢复当前数据
        //这样用户登录的时候我们就可以判断用户有没有保存数据，不让用户重复登录
        account = NSKeyedUnarchiver.unarchiveObjectWithFile(accountPath) as? UserAccount
        if isPass {
        
            print("数据过去")
            
            account = nil
        }
        
    }
    
}
// MARK: - 用户账户相关的网络方法

extension UserAccountViewModel{
    
    func loadAccessToken(code: String, finished: (isSuccessed: Bool)->()){
        NetworkTools.sharedTools.loadAccessToken(code) { (result, error) -> () in
            
            // 1> 判断错误
            if error != nil {
                print("出错了")
                //失败的回调
                finished(isSuccessed: false)
                return
            }
            
            // 2> 输出结果
             self.account = UserAccount(dict: result as! [String:AnyObject])
            self.loadUserInfo(self.account!,finished: finished)
        }
    }
    
    private func loadUserInfo(account: UserAccount, finished: (isSuccessed: Bool)->()){
        
        NetworkTools.sharedTools.loadUserInfo(account.uid!) { (result, error) -> () in
            if error != nil {
                print("加载用户出错了！")
                finished(isSuccessed: false)
                return
            }
            // 提示：如果使用 if let / guard let 统统使用 `?`
            // 作了两个判断
            // 1. result 一定有内容
            // 2. 一定是字典
            guard let dict = result as? [String: AnyObject] else {
                print("格式错误")
                finished(isSuccessed: false)
                return
            }
            // dict 一定是一个有值的字典
            // 将用户信息保存
            account.screen_name = dict["screen_name"] as? String
            account.avatar_large = dict["avatar_large"] as? String
            
            //            保存对象
            NSKeyedArchiver.archiveRootObject(account, toFile: self.accountPath)
            //完成的回调
            finished(isSuccessed: true)
        }
    }

}





